package cn.agiledata.bank.common.service;

import java.util.List;
import java.util.Map;

import cn.agiledata.bank.account.service.AccountSummary;
import cn.agiledata.bank.common.bean.DisplayBean;
import cn.agiledata.bank.common.exception.BusinessException;
import cn.agiledata.bank.common.form.BankBean;
import cn.agiledata.bank.common.util.PageBean;
import cn.agiledata.bank.hibernateBean.Account;
import cn.agiledata.bank.hibernateBean.AccountBank;
import cn.agiledata.bank.hibernateBean.ActionType;
import cn.agiledata.bank.hibernateBean.BankInfo;
import cn.agiledata.bank.hibernateBean.SubAccount;
import cn.agiledata.bank.hibernateBean.Transaction;
import cn.agiledata.bank.wap.bean.HisAccountQueryBean;

public interface ICommonService {
	public static String SERVICE_NAME = "commonServices";
	
	/**
	 * 用户登录 
	 * @param from 来源 WEB方式--Constant.WEB;WAP方式--Constant.WAP;CALL CENTER方式--Constant.CALL_CENTER
	 * @param map
	 * key=username: WEB方式--手机/email;WAP方式--手机;CALL CENTER方式--客户编号
	 * key=operatorId: WEB方式--企业客户操作员;WAP方式----null;CALL CENTER方式--null
	 * key=password	WEB方式--登陆密码;WAP方式----登陆密码;CALL CENTER方式--IVR登陆密码
	 * key=ip WEB方式--ip地址;WAP方式--null;CALL CENTER方式--null
	 * @return AccountSummary对象
	 * @throws BusinessException
	 */
	abstract public AccountSummary userLogon(String from,Map map) throws BusinessException;
	/**
	 * 注册
	 * @param from 来源 WEB方式--Constant.WEB;WAP方式--Constant.WAP;CALL CENTER方式--Constant.CALL_CENTER
	 * @param project 网站--Constant.PROJECT_WEBPAY
	 * @param map
	 * key=email: email
	 * key=mobile: 手机
	 * key=type: 客户类型 个人客户--Constant.ACCOUNT_TYPE_BUYER;企业客户--Constant.ACCOUNT_TYPE_CORPORATION
	 * key=corpName: 企业名称
	 * key=corpTel: 企业电话
	 * key=loginPassword: 登陆密码
	 * key=payPassword: 支付密码
	 * key=name:个人客户名称
	 * @throws BusinessException
	 */
	abstract public void userRegister(String from,String project,Map map) throws BusinessException;
	/**
	 * 转出/提现
	 * @param from 来源 WEB方式--Constant.WEB;WAP方式--Constant.WAP;CALL CENTER方式--Constant.CALL_CENTER
	 * @param step Constant.STEP_FIRST:第一步；Constant.STEP_SECOND:第二步；Constant.STEP_CONFIRM:最后一步
	 * @param map：key=accountId:账户的id;
	 * 			   key=accountAccountId:账户的accountId;
	 * 			   key=subAccountId:SubAccount表的id;
	 * 			   key=payPassword:web,wap方式是支付密码;call center方式是IVR支付密码
	 * 		       key=bankName:所属银行，BankInfo的id
	 * 			   key=bankNo:银行卡号
	 * 			   key=money:金额
	 * @throws BusinessException
	 */
	abstract public Transaction transfer(String from,String step,Map map) throws BusinessException;
	/**
	 * 付款
	 * @param from 来源 WEB方式--Constant.WEB;WAP方式--Constant.WAP;CALL CENTER方式--Constant.CALL_CENTER
	 * @param step Constant.STEP_FIRST:第一步；Constant.STEP_SECOND:第二步；Constant.STEP_CONFIRM:最后一步
	 * @param map:key=money:金额;
	 * 			  key=payPassword:支付密码
	 * 			  key=subAccountId:付款方的子账户id;call center:null
	 * 			  key=accountId:wap:账户id;call center:账户accountId
	 * @return
	 * @throws BusinessException
	 */
	abstract public Transaction vnvpayment(String from,String step,Map map) throws BusinessException;
	/**
	 * 设置登陆密码
	 * @param from 来源 WEB方式--Constant.WEB;WAP方式--Constant.WAP;CALL CENTER方式--Constant.CALL_CENTER
	 * @param accountId WEB方式--账户对象id;WAP方式--账户对象id;CALL_CENTER方式--账户对象的accountId;
	 * @param password	WEB方式--登陆密码;WAP方式--登陆密码;CALL_CENTER方式--ivr登陆密码;
	 */
	abstract public void loginPasswordMofify(String from,String accountId,String password);
	/**
	 * 设置支付密码
	 * @param from 来源 WEB方式--Constant.WEB;WAP方式--Constant.WAP;CALL CENTER方式--Constant.CALL_CENTER
	 * @param accountId WEB方式--账户对象id;WAP方式--账户对象id;CALL_CENTER方式--账户对象的accountId;
	 * @param password	WEB方式--支付密码;WAP方式--支付密码;CALL_CENTER方式--ivr支付密码;
	 */
	abstract public void payPasswordMofify(String from,String accountId,String originPassword,String password);
	/**
	 * 根据account对象的accountId得到ivr子账户
	 * @param accountId
	 * @return
	 */
	abstract public SubAccount getIvrSubAccountByAccountId(String accountId);
	/**
	 * 得到待处理列表
	 * @param startPage 起始页 0开始
	 * @param pageSize  每页多少条
	 * @param accountId 客户对象的id
	 * @return
	 */
	abstract public PageBean getTransactionList(int startPage,int pageSize,long accountId);
	
	abstract public SubAccount getWapSubAccount(AccountSummary accountSummary);
	abstract public Account getAccount(String id);
	abstract public Account getAccountByAccountID(String accountid);
	abstract public ActionType getActionTypeById(long id);
	abstract public SubAccount getSubAccount(String id);
	abstract public SubAccount getRemitAccount();
	abstract public int compareAccountMoney(String SubAccountId, Double wantedCount);
	abstract public AccountBank getAccountBankByAccountIdAndBankName(String accountId,String bankName);
	abstract public BankInfo getBankInfo(String id);
	abstract public void updateAccountBank(AccountBank accountBank);
	abstract public PageBean getHisAccountQueryPagingList(HisAccountQueryBean bean);
	abstract public void userRegisterByWap(String loginPassword, String payPassword,String mobile,String username) throws BusinessException;
	abstract public Account findAccountBySign(String sign);
	abstract public void updateAccount(Account account);
	abstract public void returnLoginPasswordBySMS(String mobile, Map context);
	public int compareAmounts(String subAccountId, String actionType, Double amount);
	public boolean isValidAmount(Account account, String amount);
	/**
	 * 判断交易对方是否是冻结账户或者是否被激活或者如果是企业用户的话是否通过审核
	 */
	public boolean ifOthersAvailable(Account account);
	public SubAccount findSubAccountBalance(long AccountId,String subAccountId);
	/**
	 * 银行卡列表
	 * @param accountID
	 * @return
	 */
	public List accountList(String accountID);
	
	public AccountBank getAccountBankById(String id);
	public DisplayBean getDisplayName(String accountId);
	
		
	/**
	 * @param accountId 账户id
	 * @return  List子账户列表
	 */
	abstract public List getSubAccountList(String accountId);
	/**
	 * 查询我公司所有的可以接受客户线下充值的银行信息
	 * @return
	 */
	public List getBankList();
	public BankBean getBankBeanById(String id);
}
